#include "eparking_billcalc.h"

eparking_billcalc::eparking_billcalc() {}

double eparking_billcalc::calcBill(qint64 seconds) {
    /* 根据长沙市发改委文件（示例阶梯计费规则）：
     * 1. 前2小时免费
     * 2. 第3小时起每小时5元
     * 3. 24小时最高收费50元
     * 4. 超过24小时重新累计
     */
    // 参数校验
    if (seconds <= 0) return 0.0;

    // 基础计费参数
    const int freeHours = 2;         // 免费时长
    const double hourlyRate = 5.0;   // 阶梯费率
    const double dailyMax = 50.0;    // 单日封顶

    // 计算总小时数（向上取整）
    int totalHours = static_cast<int>(ceil(seconds / 3600.0));

    // 免费时段判断
    if (totalHours <= freeHours) {
        return 0.0;
    }

    double totalFee = 0.0;

    // 跨天计算
    if (totalHours > 24) {
        // 拆分完整天数与剩余小时
        int fullDays = totalHours / 24;
        int remainHours = totalHours % 24;

        // 计算完整天数费用
        totalFee += fullDays * dailyMax;

        // 计算剩余小时费用
        if (remainHours > freeHours) {
            int chargeHours = remainHours - freeHours;
            double remainFee = chargeHours * hourlyRate;
            totalFee += std::min(remainFee, dailyMax);
        }
    }
    // 单日计算
    else {
        int chargeHours = totalHours - freeHours;
        double dayFee = chargeHours * hourlyRate;
        totalFee = std::min(dayFee, dailyMax);
    }

    return totalFee;
}
